package com.woniu;

import org.junit.jupiter.api.Test;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;


public class Demo5 {

    /**
     *
     2、（面试题）什么是fail-fast（快速失败，并发异常），如何解决fail-fast？
     - 什么是并发异常： 集合，边读，边写就会造成fail-fast
     - 一个线程一边循环遍历，另外一个线程在哪里删除元素
     */
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < 100; i++) {

            list.add("list-"+i);
        }

        // 解决方案一：加锁最直接的！
        // 解决方案二：不加锁 clone

        // 读
        new Thread(()->{
            System.out.println("A线程开始遍历s");
            ArrayList cloneList = (ArrayList) list.clone();
            for (Object s : cloneList) {
                    System.out.println(s);
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        }).start();

        // 写
        new Thread(()->{
            System.out.println("B线程开始删除");
            list.remove("list-5");
            System.out.println("删除成功！");

        }).start();
    }

    /* TOOD 在单元测试里面，然后在线程里面添加休眠，会导致程序直接中断，并且不会出现异常 */

}
